20240716 모각코 활동 3회차
오늘의 목표
1.파이토치 공부하기 - 실습해보기
2.선배님의 프로젝트 코드 절반 분석하기 - resnet 부분
파이토치 실습
import torch #파이토치 불러오기
from torch import nn #토치에서 nn 불러오기
#텐서 형태로 train데이터 가져오기
x_train = torch.Tensor([1,2,3,4,5,6]).view(6,1)
y_train = torch.Tensor([3,6,9,12,15,18]).view(6,1)
#MyNeuralNetwork 클래스 만들기. nn.Module이 부모클래스가 됨.
class MyNeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.linear_relu_stack = nn.Sequential(nn.Linear(1,1))
def forward(self, x):
logits = self.linear_relu_stack(x)
return logits
#모델
model = MyNeuralNetwork()
#손실함수
loss_function = nn.MSELoss()
#옵티마이저
optimizer = torch.optim.SGD(model.parameters(),lr=1e-2)
nums_epoch = 2000
#학습시키기
for epoch in range(nums_epoch + 1):
prediction = model(x_train)
loss = loss_function(prediction, y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 100 == 0:
print('epoch = ', epoch, 'current loss = ', loss.item())
#예측하기
x_test = torch.Tensor([8,9,10,11]).view(4,1)
pred = model(x_test)
pred
선배님의 프로젝트 코드
from huggingface_hub import hf_hub_download
import wespeaker
from huggingface_hub import hf_hub_download
huggingface_hub 라이브러리를 통해서 hf_hub_download함수를 가져와준다.
hf_hub_download함수를 통해서 모델을 다운로드 할 수 있다.
기본적으로, 함수에는 repo_id와 repo_type을 인자로 넘겨준다. (revision - 특정 버전의 파일을 다운로드 하고 싶을 시. / local_dir 특정 위치에 저장하고 싶을 시.)
import wespeaker
wespeaker을 가져와준다.
def get_resnet152():
model_id = "Wespeaker/wespeaker-voxceleb-resnet152-LM"
model_name = model_id.replace("Wespeaker/wespeaker-", "").replace("-", "_")
root_dir = hf_hub_download(model_id, filename=model_name+".onnx").replace(model_name+".onnx", "")
import os
if not os.path.isfile(root_dir+"avg_model.pt"):
os.rename(hf_hub_download(model_id, filename=model_name+".pt"), root_dir+"avg_model.pt")
if not os.path.isfile(root_dir+"config.yaml"):
os.rename(hf_hub_download(model_id, filename=model_name+".yaml"), root_dir+"config.yaml")
resnet = wespeaker.load_model_local(root_dir)
#print("Compile model for the NPU")
#resnet.model = intel_npu_acceleration_library.compile(resnet.model)
def resnet152(ado, sample_rate=None):
if isinstance(ado, str):
return resnet.recognize(ado)
else:
return recognize(resnet, ado, sample_rate)
resnet152.__dict__['register'] = lambda *args, **kwargs: resnet.register(*args, **kwargs)
return resnet152
분석
def get_resnet152():
get_resnet 152 라는 이름의 함수를 정의
model_id = "Wespeaker/wespeaker-voxceleb-resnet152-LM"
model_id라는 변수에 "Wespeaker/wespeaker-voxceleb-resnet152-LM"를 지정. 아마 모델 아이디에 모델의 이름을 저장한 것일 것.
moldelname = model.id.replace("Wespeaker/wespeaker-",").replace("-", " ")
model_name이라는 변수를 만들어서, model_id를 약간 변형시킨 이름으로 지정해줌. "voxceleb_resnet152_LM"이 될 것.
root_dir = hf_hub_download(model_id, filename = model_name+" .onnx").replace(model_name+" .onnx", "")
hf_hub_download : huggingface_hub 라이브러리를 통해서 가져왔던 함수. 함수를 사용해서 모델 파일을 다운로드하고, 다운로드한 파일을 root_dir에 저장함.
import os
os 모듈을 가져옴
os 모듈 : 파일 및 디렉토리 작업, 프로세스 및 스레드 관리, 시스템 정보와 관련한 작업들을 수행할 수 있는 모듈이다.
if not os.path.isfile(root_dir+"avg_model.pt"):
os.rename(hf_hub_download(model_id, filename=model_name+".pt"), root_dir+"avg_model.pt")
만약 avg_model.pt이름을 가진 파일이 없다면, 모델의 pt파일을 다운로드 한 뒤 이름을 avg_model.pt로 바꾸어서 root_dir 변수에 저장함.
os.path.isfile(path) : path가 파일인 경우 true를 리턴, 아니면 false를 리턴.
os.rename : 파일 또는 폴더의 이름을 간단히 변경할 수 있다.
if not os.path.isfile(root_dir+"config.yaml"):
os.rename(hf_hub_download(model_id, filename=model_name+".yaml"), root_dir+"config.yaml")
앞 코드와 같은 느낌인데, 만약 config.yaml파일이 없으면 모델의 yaml파일을 다운로드 한 뒤 이름을 바꾸어서 root_dir변수에 저장함.
resnet = wespeaker.load_model_local(root_dir)
resnet이라는 변수를 지정해줄건데, wespeaker 라이브러리의 load_model_local 함수를 사용할거임. 이 때 root_dir에 있는 파일들을 불러오게 됨.
def resnet152(ado, sample_rate=None):
if isinstance(ado, str):
return resnet.recognize(ado)
else:
return recognize(resnet, ado, sample_rate) resnet152라는 함수를 정의해주는데, 이 함수는 입력으로 ado를 받음.
instance(객체, 타입) : isinstance함수는 지정된 객체(여기에서는 ado)가 지정된 타입이면 true를 반환하고 아니면 false를 반환한다.
ado가 문자열이라면 resnet.recognize(ado)를 리턴하고
그렇지 않다면 recognize(resnet, ado, sample_rate)을 리턴함.
(recognize함수는 이전에 지정해둔 함수이다.)
def recognize(model, pcm, sample_rate):
q = extract_embedding(model, pcm, sample_rate)
best_score = 0.0
best_name = ''
for name, e in model.table.items():
score = model.cosine_similarity(q, e)
if best_score < score:
best_score = score
best_name = name
del score
gc.collect()
return {'name': best_name, 'confidence': best_score}
resnet152.__dict__['register'] = lambda *args, **kwargs: resnet.register(*args, **kwargs)
resnet152라는 함수에 register라는 기능을 추가(대체?)
lambda함수를 통해서 resnet152에서 register메서드를 사용하려고 할 때, resnet객체의 register 메서드를 가져와서 사용하게 된다.
args, kwargs : 몇 개의 인자를 받아야 할지 정할 수 없을 때 args와 kwargs(keyword arguments)를 파라미터로 써줌. args 앞에 붙는 * 는 여러개의 인자를 묶어서 하나의 튜플로 묶어주고 이를 args에 할당해준다. kwargs 앞에 붙는 ** 는 여러개의 키워드 아규먼트들을 묶어서 딕셔너리로 만들어준다.
return resnet152
get_resnet152라는 함수는 resnet152를 반환함.
resnet152 = get_resnet152()
print("INFO: ResNet152 Ready -", resnet152)
분석
resnet152 = get_resnet152()
get_resnet152함수를 가져와서 resnet152함수에 저장함
print("INFO: ResNet152 Ready -", resnet152)
모델이 준비되었다는 메시지를 출력한 뒤, resnet152를 출력함.